"""
由于计算机是不能直接处理原始数据的，故我们需要将转换成计算机可以理解的数值化的数据，而且要突出数据的特征。
将任意数据转换为可用于机器学习算法的数值特征

1 字典特征提取
2 文本特征提取（英文和中文）
"""

from sklearn.feature_extraction import DictVectorizer


def dictVector():
    """
    字典特征提取
    应用场景：数据集中类别比较多，特征包含多个类别
        假设我们有一个关于汽车的数据集，其中每个样本代表一辆汽车，并且数据集包含以下类别特征：
        品牌      颜色      车型
        宝马      红色      轿车
        奔驰      蓝色      SUV
        奥迪      白色      跑车
    :return:
    """
    data = [{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60},{'city': '深圳', 'temperature': 30}]
    print(f"原始数据类型：{type(data)}")

    # 实例化一个字典特征转换器 sparse是否稀疏
    vector = DictVectorizer(sparse=False)
    # vector = DictVectorizer()
    data_new = vector.fit_transform(data)
    show(data_new)
    print("特征名字：\n", vector.get_feature_names_out())
    return None


from sklearn.feature_extraction.text import CountVectorizer


def en_text_vector():
    """
    英文文本的特征提取
    :return:
    """
    corpus = [
        'This is the first document.',
        'This is the second second document.',
        'And the third one.',
        'Is this the first document?',
    ]
    # 实例化一个文本特征提取器
    vector = CountVectorizer()
    X = vector.fit_transform(corpus)
    # 统计每个特征词出现的个数
    print(X.toarray())
    print("特征名字：\n", vector.get_feature_names_out())
    return None


import jieba


def ch_text_vector():
    """
    中文文本特征处理
    应用场景：文本文章分类
    :return:
    """
    text = ["文本分析是机器学习算法的主要应用领域。",
            "然而，原始数据，符号文字序列不能直接传递给算法，因为它们大多数要求具有固定长度的数字矩阵特征向量，而不是具有可变长度的原始文本文档。",
            "为解决这个问题，scikit-learn提供了从文本内容中提取数字特征的最常见方法。"]
    # 中文文本需要分词后才能进行特征提取
    for index in range(0, len(text)):
        text[index] = " ".join(jieba.lcut(text[index], cut_all=False))

    print("分词后的文本：\n", text)
    """
    实例化一个文本特征提取器
    stop_words指定停用词，哪些词不作为特征词来统计
    """
    vector = CountVectorizer(stop_words=["不能", "不是"])
    vector_text = vector.fit_transform(text)
    print("特征提取后的结果：\n", vector_text.toarray())
    print("特征名字：\n", vector.get_feature_names_out())
    return None

from sklearn.feature_extraction.text import TfidfVectorizer
def tf_idf_text_vector():
    """
    tf_idf文本特征抽取
    词权重，tf_idf主要思想是某个词在当前文章中出现的频率高，在其他文章中出现的频率低，tf_idf值就高，
    用于体现词在文章中的重要性。像 你我他 不能 之类的词tf_idf值就很低。
    :return:
    """
    text = ["文本分析是机器学习算法的主要应用领域。",
            "然而，原始数据，符号文字序列不能直接传递给算法，因为它们大多数要求具有固定长度的数字矩阵特征向量，而不是具有可变长度的原始文本文档。",
            "为解决这个问题，scikit-learn提供了从文本内容中提取数字特征的最常见方法。"]
    for index in range(0, len(text)):
        text[index] = " ".join(jieba.lcut(text[index], cut_all=False))

    vector = TfidfVectorizer()
    vector_text = vector.fit_transform(text)
    print("特征提取后的结果：\n", vector_text.toarray())
    print("特征名字：\n", vector.get_feature_names_out())

    return None

def show(msg):
    print("信息：\n", msg)
    print("类型是：\n", type(msg))
    return None


if __name__ == '__main__':
    # 字典特征提取
    dictVector()

    # 英文文本的特征提取
    # en_text_vector()

    # 中文文本的特征提取
    # ch_text_vector()

    # tf_idf文本特征抽取
    # tf_idf_text_vector()